﻿#version 330 core
precision mediump float;

in vec2 texture_coord;
out vec4 frag_color;

uniform sampler2D image;

const float offset = 1.0 / 300.0;  

void main() {
  // 常规渲染
  // frag_color = texture(image, texture_coord);
  // 反相
  // frag_color = vec4(vec3(1.0f - texture(image, texture_coord)), 1.0f);
  // 灰度
  //frag_color = texture(image, texture_coord);
  // 理论上的灰度
  // float average = (frag_color.r + frag_color.g, frag_color.b) / 3.0f;
  // 人眼更敏感的灰度
  //float average = 0.2126 * frag_color.r + 0.7152 * frag_color.g + 0.0722 * frag_color.b;
  //frag_color = vec4(average, average, average, 1.0f);
  vec2 offsets[9] = vec2[](
    vec2(-offset,  offset), // 左上
    vec2( 0.0f,    offset), // 正上
    vec2( offset,  offset), // 右上
    vec2(-offset,  0.0f),   // 左
    vec2( 0.0f,    0.0f),   // 中
    vec2( offset,  0.0f),   // 右
    vec2(-offset, -offset), // 左下
    vec2( 0.0f,   -offset), // 正下
    vec2( offset, -offset)  // 右下
  );
  // 锐化
//  float kernel[9] = float[](
//    -1, -1, -1,
//    -1,  9, -1,
//    -1, -1, -1
//  );
  // 模糊
//  float kernel[9] = float[](
//    1.0 / 16, 2.0 / 16, 1.0 / 16,
//    2.0 / 16, 4.0 / 16, 2.0 / 16,
//    1.0 / 16, 2.0 / 16, 1.0 / 16  
//  );
  // 边缘检测
  float kernel[9] = float[](
    1,  1, 1,
    1, -8, 1,
    1,  1, 1
  );
  vec3 sample_tex[9];
  for(int i = 0; i < 9; i++) {
    sample_tex[i] = vec3(texture(image, texture_coord.st + offsets[i]));
  }
  vec3 col = vec3(0.0);
  for(int i = 0; i < 9; i++) {
    col += sample_tex[i] * kernel[i];
  }
  frag_color = vec4(col, 1.0);
}